package com.linciping.gradle.inject.view

import groovy.lang.Closure

/**
 * 扩展配置数据类
 */
class InjectExtension {
    //扩展配置操作
    private val filterOptions = mutableListOf<(FilterOption) -> Unit>()

    /**
     * 过滤方法
     */
    fun filters(closure: Closure<*>) {
        filterOptions.add { filterOption -> filterOption.execute(closure) }
    }

    /**
     * 获取过滤的包名
     */
    fun getFilterPackages(): List<String> {
        val filterOption = FilterOption()
        filterOptions.forEach {
            it(filterOption)
        }
        return filterOption.filterPackages
    }

    /**
     * 获取过滤的类名
     */
    fun getFilterClasses(): List<String> {
        val filterOption = FilterOption()
        filterOptions.forEach {
            it(filterOption)
        }
        return filterOption.filterClasses
    }
}

/**
 * 过滤配置
 */
class FilterOption {

    val filterPackages = mutableListOf<String>()
    val filterClasses = mutableListOf<String>()

    /**
     * 添加一个需要过滤的包名
     * @param filterPackage 包名可以应该遵循点号(.)分割
     */
    fun packageName(filterPackage: String) {
        filterPackages.add(filterPackage)
    }

    /**
     * 添加一个需要过滤的类名
     * @param className 这个一个简单类名，不包含包名
     */
    fun className(className: String) {
        filterClasses.add(className)
    }

    /**
     * 实际执行的方法
     */
    fun execute(closure: Closure<*>) {
        closure.resolveStrategy = Closure.DELEGATE_FIRST
        //委托给Closure对象处理，内部通过在build.gradle中声明的方法名，反射在当前类中找到对应方法
        closure.delegate = this
        closure.call()
    }

}
